# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：  
# 1. 不得用于任何商业用途。  
# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。  
# 3. 不得进行大规模爬取或对平台造成运营干扰。  
# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。   
# 5. 不得用于任何非法或不当的用途。
#   
# 详细许可条款请参阅项目根目录下的LICENSE文件。  
# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。  


import argparse
import logging
import os
from random import Random

import config

from .crawler_util import *
from .time_util import *


def init_loging_config():
    """
    init loging config
    Returns:

    """
    level = logging.INFO
    logging.basicConfig(
        level=level,
        format="%(asctime)s %(name)s %(levelname)s (%(filename)s:%(lineno)d) - %(message)s",
        datefmt='%Y-%m-%d %H:%M:%S',
        encoding='utf-8'
    )
    _logger = logging.getLogger("MediaCrawlerPro")
    _logger.setLevel(level)

    if config.ENABLE_LOG_FILE:
        # create logs dir
        project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
        log_dir = os.path.join(project_root, 'logs', config.PLATFORM)
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        log_file = os.path.join(log_dir, f"{get_current_date()}.log")
        file_handler = logging.FileHandler(
            filename=log_file,
            encoding="utf-8"
        )
        file_handler.setLevel(level)
        file_handler.setFormatter(logging.Formatter(
            fmt="%(asctime)s %(name)s %(levelname)s (%(filename)s:%(lineno)d) - %(message)s",
            datefmt='%Y-%m-%d %H:%M:%S'
        ))
        _logger.addHandler(file_handler)

    return _logger


logger = init_loging_config()

def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')


def get_random_str(random_len: int = 12) -> str:
    """
    获取随机字符串
    :param random_len:
    :return:
    """
    random_str = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    _random = Random()
    for i in range(random_len):
        random_str += chars[_random.randint(0, length)]
    return random_str


def random_delay_time(min_time: int = 1, max_time: int = 3) -> int:
    """
    获取随机延迟时间
    :param min_time:
    :param max_time:
    :return:
    """
    return random.randint(min_time, max_time)


def parse_fuzzy_number_with_random(fuzzy_str: str) -> int:
    """
    将模糊数据字符串转换为整数，并添加随机整数
    如果是数字，则直接返回
    支持格式：
    1. 纯数字: "2" -> 2
    2. 带加号: "10+" -> 随机(10-19), "300+" -> 随机(300-399)
    3. 带单位: "1.2w" "1.2万" -> 随机(12000-12999)
    4. 带单位和加号: "1.2w+" "1.2万+" -> 随机(12000-12999)
    """
    try:
        if not fuzzy_str or not isinstance(fuzzy_str, (str, int)):
            return 0

        str_value = str(fuzzy_str).strip()

        if str_value.isdigit():
            return int(str_value)

        has_plus = "+" in str_value
        str_value = str_value.replace("+", "").strip()

        units = {
            "w": 10000,
            "万": 10000,
            "k": 1000,
            "千": 1000
        }

        unit_found = None
        for unit, multiplier in units.items():
            if unit in str_value:
                unit_found = unit
                number_part = str_value.replace(unit, "")
                try:
                    base_number = int(float(number_part) * multiplier)
                    random_max = multiplier // 10 - 1
                    random_addition = random.randint(0, random_max)
                    return base_number + random_addition
                except ValueError:
                    return 0

        if has_plus and not unit_found:
            try:
                base_number = int(str_value)
                magnitude = 1
                temp = base_number
                while temp >= 10:
                    magnitude *= 10
                    temp //= 10
                random_max = base_number + (magnitude - 1)
                return random.randint(base_number, random_max)
            except ValueError:
                return 0

        try:
            return int(float(str_value))
        except ValueError:
            return 0

    except Exception as e:
        print(f"解析模糊数字失败: {str(e)}, 原始值: {fuzzy_str}")
        return 0
